
<!doctype html>
<html lang="en" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
      
        <link rel="prev" href="..">
      
      
        <link rel="next" href="../quick-start/">
      
      
      <link rel="icon" href="../assets/images/favicon.png">
      <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.18">
    
    
      
        <title>⚙️ 环境配置 - 大模型数据助手</title>
      
    
    
      <link rel="stylesheet" href="../assets/stylesheets/main.7e37652d.min.css">
      
      


    
    
      
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
    <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
    
  </head>
  
  
    <body dir="ltr">
  
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#_1" class="md-skip">
          Skip to content
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
    
      

  

<header class="md-header md-header--shadow" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="Header">
    <a href=".." title="大模型数据助手" class="md-header__button md-logo" aria-label="大模型数据助手" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            大模型数据助手
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              ⚙️ 环境配置
            
          </span>
        </div>
      </div>
    </div>
    
    
      <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
    
    
      <div class="md-header__option">
  <div class="md-select">
    
    <button class="md-header__button md-icon" aria-label="Select language">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m12.87 15.07-2.54-2.51.03-.03A17.5 17.5 0 0 0 14.07 6H17V4h-7V2H8v2H1v2h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2zm-2.62 7 1.62-4.33L19.12 17z"/></svg>
    </button>
    <div class="md-select__inner">
      <ul class="md-select__list">
        
          <li class="md-select__item">
            <a href="./" hreflang="en" class="md-select__link">
              English
            </a>
          </li>
        
          <li class="md-select__item">
            <a href="../zh/environment/" hreflang="zh" class="md-select__link">
              简体中文
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</div>
    
    
      
      
        <label class="md-header__button md-icon" for="__search">
          
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
        </label>
        <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
        
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="Search">
        
        <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
          
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
        </button>
      </nav>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            Initializing search
          </div>
          <ol class="md-search-result__list" role="presentation"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
      
    
    
      <div class="md-header__source">
        <a href="https://github.com/apconw/sanic-web" title="Go to repository" class="md-source" data-md-component="source">
  <div class="md-source__icon md-icon">
    
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
  </div>
  <div class="md-source__repository">
    apconw/sanic-web
  </div>
</a>
      </div>
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    



<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href=".." title="大模型数据助手" class="md-nav__button md-logo" aria-label="大模型数据助手" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>

    </a>
    大模型数据助手
  </label>
  
    <div class="md-nav__source">
      <a href="https://github.com/apconw/sanic-web" title="Go to repository" class="md-source" data-md-component="source">
  <div class="md-source__icon md-icon">
    
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
  </div>
  <div class="md-source__repository">
    apconw/sanic-web
  </div>
</a>
    </div>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
  
  
  
  
    <li class="md-nav__item">
      <a href=".." class="md-nav__link">
        
  
  
  <span class="md-ellipsis">
    🏠 首页
    
  </span>
  

      </a>
    </li>
  

    
      
      
  
  
    
  
  
  
    <li class="md-nav__item md-nav__item--active">
      
      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
      
      
      
        <label class="md-nav__link md-nav__link--active" for="__toc">
          
  
  
  <span class="md-ellipsis">
    ⚙️ 环境配置
    
  </span>
  

          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <a href="./" class="md-nav__link md-nav__link--active">
        
  
  
  <span class="md-ellipsis">
    ⚙️ 环境配置
    
  </span>
  

      </a>
      
        

<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#_1" class="md-nav__link">
    <span class="md-ellipsis">
      💡环境配置要求
    </span>
  </a>
  
    <nav class="md-nav" aria-label="💡环境配置要求">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    <span class="md-ellipsis">
      🔧 前置条件
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    <span class="md-ellipsis">
      📚 大模型选择
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#clone" class="md-nav__link">
    <span class="md-ellipsis">
      🧩 Clone仓库
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mino" class="md-nav__link">
    <span class="md-ellipsis">
      🌲 Mino
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌲 Mino">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    <span class="md-ellipsis">
      安装
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dify" class="md-nav__link">
    <span class="md-ellipsis">
      🌳 Dify
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌳 Dify">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    <span class="md-ellipsis">
      安装
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#gpt-vis-api" class="md-nav__link">
    <span class="md-ellipsis">
      🌴 gpt-vis-api
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌴 gpt-vis-api">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    <span class="md-ellipsis">
      验证
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mcp-hub" class="md-nav__link">
    <span class="md-ellipsis">
      🌵 mcp-hub
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌵 mcp-hub">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    <span class="md-ellipsis">
      工具
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#noe4j" class="md-nav__link">
    <span class="md-ellipsis">
      🌿 Noe4j
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌿 Noe4j">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
      
    </li>
  

    
      
      
  
  
  
  
    <li class="md-nav__item">
      <a href="../quick-start/" class="md-nav__link">
        
  
  
  <span class="md-ellipsis">
    🚀 快速体验
    
  </span>
  

      </a>
    </li>
  

    
      
      
  
  
  
  
    <li class="md-nav__item">
      <a href="../local-development/" class="md-nav__link">
        
  
  
  <span class="md-ellipsis">
    🛠️ 本地开发
    
  </span>
  

      </a>
    </li>
  

    
      
      
  
  
  
  
    <li class="md-nav__item">
      <a href="../faq/" class="md-nav__link">
        
  
  
  <span class="md-ellipsis">
    ℹ️ 常见问题
    
  </span>
  

      </a>
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
              
              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#_1" class="md-nav__link">
    <span class="md-ellipsis">
      💡环境配置要求
    </span>
  </a>
  
    <nav class="md-nav" aria-label="💡环境配置要求">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    <span class="md-ellipsis">
      🔧 前置条件
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    <span class="md-ellipsis">
      📚 大模型选择
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#clone" class="md-nav__link">
    <span class="md-ellipsis">
      🧩 Clone仓库
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mino" class="md-nav__link">
    <span class="md-ellipsis">
      🌲 Mino
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌲 Mino">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    <span class="md-ellipsis">
      安装
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dify" class="md-nav__link">
    <span class="md-ellipsis">
      🌳 Dify
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌳 Dify">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    <span class="md-ellipsis">
      安装
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#gpt-vis-api" class="md-nav__link">
    <span class="md-ellipsis">
      🌴 gpt-vis-api
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌴 gpt-vis-api">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    <span class="md-ellipsis">
      验证
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mcp-hub" class="md-nav__link">
    <span class="md-ellipsis">
      🌵 mcp-hub
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌵 mcp-hub">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    <span class="md-ellipsis">
      工具
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#noe4j" class="md-nav__link">
    <span class="md-ellipsis">
      🌿 Noe4j
    </span>
  </a>
  
    <nav class="md-nav" aria-label="🌿 Noe4j">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    <span class="md-ellipsis">
      启动
    </span>
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    <span class="md-ellipsis">
      配置
    </span>
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
                  </div>
                </div>
              </div>
            
          
          
            <div class="md-content" data-md-component="content">
              <article class="md-content__inner md-typeset">
                
                  


  
    <a href="https://github.com/apconw/sanic-web/edit/master/docs/environment.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
      
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
    </a>
  
  
    
      
    
    <a href="https://github.com/apconw/sanic-web/raw/master/docs/environment.md" title="View source of this page" class="md-content__button md-icon">
      
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
    </a>
  


  <h1>⚙️ 环境配置</h1>

<h2 id="_1">💡环境配置要求</h2>
<p>在开始之前，请确保您的开发环境满足以下最低配置要求：</p>
<ul>
<li><strong>操作系统</strong>：Windows 10/11, macOs M系列, Centos/Ubuntu</li>
<li><strong>GPU</strong>: 本地使用ollama部署，推荐使用Nvidia显卡或CPU模式。<strong>推荐公网购买APIKEY形式</strong></li>
<li><strong>内存</strong>：8GB+</li>
</ul>
<h3 id="_2">🔧 <strong>前置条件</strong></h3>
<ul>
<li>Python 3.11.x</li>
<li>uv 0.8.0+</li>
<li>Dify 0.7.1+</li>
<li>Mysql 8.0+</li>
<li>Node.js 18.12.x+</li>
<li>Pnpm 9.x</li>
<li>Mcp-Hub 0.9.0+</li>
<li>Gpt-vis-api 0.0.1+</li>
</ul>
<h3 id="_3">📚 <strong>大模型选择</strong></h3>
<ul>
<li>推荐购买公网大模型<a href="http://aliyun.com/product/bailian">阿里云公网大模型服务APIKEY</a></li>
<li>模型要求: <strong>Qwen3/Qwen-Plus/Deepseek</strong> 模型</li>
</ul>
<h3 id="clone">🧩 <strong>Clone仓库</strong></h3>
<pre><code class="language-angular2html">git clone https://github.com/apconw/sanic-web.git
</code></pre>
<h3 id="mino">🌲 Mino</h3>
<blockquote>
<p>下面chat-service/gpt-vis-api服务都依赖Minio服务</p>
</blockquote>
<h4 id="_4">安装</h4>
<pre><code class="language-angular2html">cd docker
docker compose up -d minio
</code></pre>
<h4 id="_5">配置</h4>
<ul>
<li>访问MinIO服务，http://localhost:19001/ 账号:admin 密码:12345678</li>
<li>创建两个个bucket，名称<strong>filedata和chart-images</strong> <strong>同时配置Access Key保存好下面会使用</strong></li>
<li>修改bucket的<strong>chart-images</strong>访问策略为<strong>public</strong></li>
</ul>
<p><img alt="image" src="../images/minio.png" />
 <img alt="image" src="../images/minio-b.png" /></p>
<h3 id="dify">🌳 <strong>Dify</strong></h3>
<h4 id="_6">安装</h4>
<ul>
<li><strong>安装Dify</strong> <a href="https://docs.dify.ai/zh-hans">官方参考文档</a></li>
<li><strong>如果已经安装过Dify环境，可跳过该步骤</strong></li>
<li>为了兼顾第一次接触大模型应用的同学，本项目提供了一键拉起Dify服务方便大家快速体验。</li>
<li>Dify本机访问地址：http://localhost:18000 账号/密码: 需自己注册</li>
</ul>
<pre><code class="language-angular2html"># 拉起内置的dify服务
cd docker/dify/docker
docker-compose up -d
</code></pre>
<h4 id="_7">配置</h4>
<ul>
<li>购买<a href="http://aliyun.com/product/bailian">阿里云公网大模型服务APIKEY</a></li>
<li>导入项目根目录下的<strong>docker/docker/dify/数据问答_v1.1.6_qwen_plus.yml画布</strong> </li>
<li>获取画布对应的<strong>api-key</strong>先复制出来下面步骤会使用</li>
<li>导入画布后<strong>大模型节点</strong>需要手动选择一下当前你配置的大模型并保存</li>
<li>画布<strong>HTTP节点</strong>地址修改,本地部署默认不用修改服务器上需修改为实际IP地址<ul>
<li><strong>服务器上启动画布里面所有地方host.docker.internal需修改为实际IP地址</strong></li>
</ul>
</li>
<li>操作步骤如下图:
 <img alt="image" src="../images/llm-setting.png" />
 <img alt="image" src="../images/import-convas.png" />
 <img alt="image" src="../images/convas-api-key.png" /></li>
</ul>
<h3 id="gpt-vis-api">🌴 gpt-vis-api</h3>
<p>GPT-VIS-API 是一个轻量级图表生成服务，<strong>旨在解决 antv/mcp-server-chart 在私有化部署方面的局限性</strong>。该服务接收数据请求，生成图表图像，上传到 MinIO 对象存储，并返回带有效期的预签名访问链接。
- <a href="https://github.com/apconw/gpt-vis-api">GPT-VIS API</a></p>
<blockquote>
<p>mcp-server-chart是蚂蚁开源的MCP图表渲染工具支持以下图表</p>
</blockquote>
<p><img alt="image" src="../images/antv-chart.png" /></p>
<h4 id="_8">配置</h4>
<ul>
<li>根据情况修改docker/docker-compose.yml里<strong>gpt-vis-api</strong>服务的环境变量的值</li>
<li><strong>以下配置本机启动默认不用修改,在服务器上部署时host.docker.internal需修改为实际IP地址</strong><ul>
<li>可修改<strong>MINIO_ENDPOINT</strong> MinIO服务地址</li>
<li><strong>必须修改MINIO_ACCESS_KEY</strong> MinIO服务访问密钥</li>
<li><strong>必须修改MINIO_SECRET_KEY</strong> MinIO服务密钥</li>
<li>可修改<strong>MINIO_PUBLIC_DOMAIN</strong> 图片访问域名</li>
</ul>
</li>
</ul>
<h4 id="_9">启动</h4>
<pre><code class="language-angular2html">cd docker
docker compose up -d gpt-vis-api
</code></pre>
<h4 id="_10">验证</h4>
<pre><code class="language-shell">curl -X POST http://localhost:3100/generate \
  -H &quot;Content-Type: application/json&quot; \
  -d '{
    &quot;type&quot;: &quot;line&quot;,
    &quot;data&quot;: [
      {&quot;time&quot;: &quot;2025-05&quot;, &quot;value&quot;: 512},
      {&quot;time&quot;: &quot;2025-06&quot;, &quot;value&quot;: 1024}
    ]
  }'

响应示例：
{
  &quot;url&quot;: &quot;http://localhost:19000/gpt-vis/chart-123.png?Expires=XYZ&quot;
}
</code></pre>
<h3 id="mcp-hub">🌵 mcp-hub</h3>
<ul>
<li><a href="https://github.com/samanhappy/mcphub">官方文档</a><blockquote>
<p>mcp-hub是一个开源的MCP聚合工具方便安装和管理MCP工具</p>
</blockquote>
</li>
</ul>
<h4 id="_11">启动</h4>
<pre><code class="language-angular2html">cd docker

# 创建volume目录
mkdir -p ./volume/mcp-data

# 创建一个空的或默认的 mcp_settings.json 文件
touch ./volume/mcp-data/mcp_settings.json

# 启动容器
docker compose up -d mcphub
</code></pre>
<p><img alt="image" src="../images/mcp-hub-01.png" /></p>
<h4 id="_12">配置</h4>
<ul>
<li>登录http://localhost:3300/ admin/admin123</li>
<li><strong>国内镜像配置</strong><ul>
<li>Python 包仓库地址: https://mirrors.aliyun.com/pypi/simple</li>
<li>NPM 仓库地址: https://registry.npmmirror.com
<img alt="image" src="../images/mcp-hub-02.png" /></li>
</ul>
</li>
</ul>
<h4 id="_13">工具</h4>
<blockquote>
<p>需要安装两个工具mcp-server-chart蚂蚁图表工具/12306火车票查询工具</p>
</blockquote>
<ul>
<li><strong>mcp-server-chart</strong><ul>
<li><strong>VIS_REQUEST_SERVER</strong>环境变量配置默认为<strong>gpt-vis-api</strong>服务地址本</li>
<li>本地启动不需要修改如果是服务器部署<strong>host.docker.internal</strong>需要修改为实际IP地址</li>
<li>安装完成后创建一个工具组并复制访问地址先保存一下</li>
<li>后面配置<strong>MCP_HUB_DATABASE_QA_GROUP_URL</strong>变量时从这里取值</li>
</ul>
</li>
</ul>
<pre><code class="language-angular2html">npx -y -y @antv/mcp-server-chart

VIS_REQUEST_SERVER: http://host.docker.internal:3100/generate
</code></pre>
<ul>
<li>
<p>安装工具
<img alt="image" src="../images/antv-mcp.png" /></p>
</li>
<li>
<p>创建组
<img alt="image" src="../images/antv-group.png" /></p>
</li>
<li>
<p>获取访问链接
<img alt="image" src="../images/antv-group-url.png" /></p>
</li>
<li>
<p><strong>12306火车票查询工具</strong></p>
<ul>
<li>安装完成后创建一个工具组并复制访问地址先保存一下</li>
<li>后面配置<strong>MCP_HUB_COMMON_QA_GROUP_URL</strong>变量时从这里取值</li>
</ul>
</li>
</ul>
<pre><code class="language-angular2html">npx -y 12306-mcp
</code></pre>
<ul>
<li>
<p>安装工具
<img alt="image" src="../images/12306.png" /></p>
</li>
<li>
<p>创建组
<img alt="image" src="../images/12306-group.png" /></p>
</li>
<li>
<p>获取访问链接
<img alt="image" src="../images/12306-group-url.png" /></p>
</li>
</ul>
<h3 id="noe4j">🌿 Noe4j</h3>
<blockquote>
<p>Noe4j是一个开源的图数据库，用于存储和查询关系数据。
Noe4j的安装和配置请参考<a href="https://neo4j.com/docs/operations-manual/current/installation/">官方文档</a></p>
</blockquote>
<h4 id="_14">启动</h4>
<pre><code class="language-angular2html">cd docker
docker compose up -d neo4j-apoc
</code></pre>
<h4 id="_15">配置</h4>
<ul>
<li>登录http://localhost:7474/browser/ neo4j/neo4j123</li>
</ul>
<p><img alt="image" src="../images/eno4j-db.png" /></p>












                
              </article>
            </div>
          
          
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
        </div>
        
          <button type="button" class="md-top md-icon" data-md-component="top" hidden>
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
  Back to top
</button>
        
      </main>
      
        <footer class="md-footer">
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
    <div class="md-copyright__highlight">
      Copyright &copy; 2025 apconw
    </div>
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    
    
    
      
      <script id="__config" type="application/json">{"base": "..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.top", "navigation.expand"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
    
    
      <script src="../assets/javascripts/bundle.92b07e13.min.js"></script>
      
    
  </body>
</html>